/*
CPCL命令集（标签打印机）
查看佳博CPCL命令手册

注：200 DPI: 1 mm = 8 dots
   300 DPI: 1 mm = 12 dots

 */
import 'package:xsdk_flutter/xsdk/utils/print/base/x_utils_print_command_base.dart';

class XBaseCPCLPrintCommandUtils{

  static const String PrintCommand_CPCL_Initialize_SIZE = "PrintCommand_CPCL_Initialize_SIZE";
  static const String PrintCommand_CPCL_PRINT = "PrintCommand_CPCL_PRINT";


  //打印字符串命令ok(原默认不支持换行,这里不处理,在算法方法中统一处理)
  static String cpcl_text(
      int textX,
      int textY,
      String text,
      int textSize,
      bool isBold,
      int rotation //0,90,180,270
      ){

    //字体大小
    String textSizeCommand="";
    if (textSize==1){
      //字体放大1倍
      textSizeCommand="SETMAG 1 1\r\n";
    }else if (textSize==2){
      //字体放大2倍
      textSizeCommand="SETMAG 2 2\r\n";
    }else{
      //默认字体
      textSizeCommand="SETMAG 0 0\r\n";
    }

    //是否加粗
    String textBoldCommand="";
    if (isBold){
      textBoldCommand="SETBLOD 1\r\n";
    }else{
      textBoldCommand=textBoldCommand="SETBLOD 0\r\n";
    }


    /*
         文字
         {command} {font} {size} {x} {y} {data}
         字体编号(如果打不出内容,则试换字体编码)
         0 12*24 24*24 简体中文 GB18030
         24 12*24 24*24 简体中文 GB18030
        */
    String textCommand= "TEXT 24 0 $textX $textY $text\r\n";
    return textSizeCommand+textBoldCommand+textCommand;

  }

  //通用命令
  static String getPrintCommand_CPCL(String type, List<int>? values)
  {
    String command="";

    /*
        注意:
        1.每条指令后需要添加 "\r\n"
        2.在单位与数字之间必须添加一个空格
        3.一张标签通常包含三个部分，即系统设定（1部分）、打印内容设定（2部分）和执行打印指令（3部分）
         */

    switch (type){
      case PrintCommand_CPCL_Initialize_SIZE:
      //1.初始化打印机,设置标签大小,间隔大小,和清除缓存
        if (values!=null && values.length==2){
          //<!> {offset} <200> <200> {height} {qty}
          int printerDPI=values[0];//200/300
          int heightMm=values[1];//标签高度MM
          int heightDot=0;

          /*
                    标签最大高度的计算方法是，先测出从第 1 个黑条（或标签间隙）底部到下一 个黑条（或标签间隙）顶部之间的距离。
                    然后从中减去 1/16 英寸（1.5 毫米）， 所得结果即最大高度。
                    （以点为单位时：对于 203 DPI 打印机，减去 12 点；对 于 306 DPI 打印机，减去 18 点）
                     */
          int heihgtSub=0;
          //
          if (printerDPI<260){
            printerDPI=200;
            heihgtSub=12;
          }else{
            printerDPI=300;
            heihgtSub=18;
          }
          heightDot=XBasePrintCommandUtils.dot1MM(printerDPI)*heightMm-heihgtSub;

          //
          command="! 0 $printerDPI $printerDPI $heightDot 1\r\n";
        }
        break;
      case PrintCommand_CPCL_PRINT:
      //3.输出打印缓存区内容命令
        command="PRINT\r\n";
        break;
      default:
        break;
    }

    return command;
  }



}